<?php

namespace App\Http\Controllers\FileControllers;

use App\Models\DataTableModel\Folder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use App\Http\Controllers\Controller;

class FolderNewControllers extends Controller
{
    public function createFolders(Request $request)
    {
        try {
            // 验证请求数据  
            $request->validate([
                'folder_name' => 'required|string|max:255',
                'parent_folder_id' => 'nullable|integer',
            ]);
            dump($request);
            // 获取当前登录用户的ID  
            $userId = Auth::id();

            // 查找用户的根目录文件夹（parent_folder_id 为 null）  
            $rootFolder = Folder::where('id', $userId)->whereNull('parent_folder_id')->first();
            if (!$rootFolder) {
                throw new \Exception('找不到用户根文件夹');
            }

            // 如果指定了parent_folder_id，检查它是否属于当前用户  
            if ($request->input('parent_folder_id')) {
                $parentFolder = Folder::find($request->input('parent_folder_id'));
                if (!$parentFolder || $parentFolder->id !== $userId) {
                    throw new \Exception('指定的父文件夹不存在或不属于当前用户');
                }
            }

            // 检查是否已存在同名文件夹（在同一父文件夹下）  
            $existingFolder = Folder::where('folder_name', $request->input('folder_name'))
                ->where('parent_folder_id', $request->input('parent_folder_id', ($rootFolder ? $rootFolder->folder_id : null)))
                ->first();
            if ($existingFolder) {
                return response()->json([
                    'message' => '具有相同名称的文件夹已存在',
                ], 409); // 409 Conflict  
            }

            // 获取根目录文件夹的名称  
            $rootFolderName = $this->getRootFolderName($userId);
            // 获取传进来的文件名
            $fileName = $request->input('folder_name');
            // 获取当前用户的根目录文件夹id,根据用户id和parent_folder_id字段为null查出用户根目录
            $rootFolderId = Folder::where('id', $userId)->whereNull('parent_folder_id')->value('folder_id');
            // 检查
            if (!$rootFolderId) {
                throw new \Exception('找不到用户根文件夹id');
            }
            $folder_parent_folder_id = $request->input('parent_folder_id');
            dump($folder_parent_folder_id);
            if ($folder_parent_folder_id === null) {
                // 如果folder_parent_folder_id=null,则使用用户根目录
                $rootFolderName = Folder::where('id', $userId)->whereNull('parent_folder_id')->value('folder_name');
            } else {
                $folder = Folder::find($folder_parent_folder_id);
                // 获取文件夹name
                $folderName = $folder->folder_name;
                // 根据文件夹父文件夹id循环查找文件夹name，拼接，直到folder表中parent_folder_id=null
                // 拼接文件夹路径
                $folderPath = $folderName; // 用来存储完整路径的变量
                $pr_id = $folder->parent_folder_id; // 保存当前层级父文件夹id
                while ($pr_id != null) {
                    $pr_folder = Folder::find($pr_id);
                    $folderPath = $pr_folder->folder_name . '/' . $folderPath;
                    $pr_id = $pr_folder->parent_folder_id;
                }
                $rootFolderName = $folderPath;
            }








            // 创建新的文件夹记录  
            $folder = new Folder;
            $folder->folder_name = $request->input('folder_name');
            // 设置parent_folder_id。如果请求中提供了parent_folder_id，则使用该值；否则，使用根目录的folder_id  
            $folder->parent_folder_id = $request->has('parent_folder_id') && $request->input('parent_folder_id') !== null ? $request->input('parent_folder_id') : $rootFolderId;
            $folder->id = $userId;



            // 构建文件夹路径  
            $basePath = "public/UserNetworkDiskFile/" . $rootFolderName . "/";
            $path = $basePath . $fileName;
            dump($rootFolderName);
            dump($basePath);
            dump($path);
            // 在文件系统中创建实际的文件夹  
            if (!Storage::exists($basePath)) {
                Storage::makeDirectory($basePath);
            }
            // 创建文件夹
            if (!Storage::exists($path)) {
                Storage::makeDirectory($path);
                // 保存文件夹记录到数据库  
                $folder->save();
                // 返回响应  
                return response()->json([
                    'message' => 'Folder created successfully.',
                    'folder' => $folder,
                    'folder_path' => $path, // 返回实际创建的文件夹路径  
                    'parent_folder_id' => $rootFolderId, // 返回父文件夹ID
                ], 201);
            }
        } catch (ValidationException $e) {
            // 处理验证异常  
            return response()->json([
                'message' => 'Validation failed.',
                'errors' => $e->errors(),
            ], 422);
        } catch (\Exception $e) {
            // 捕获其他异常并处理  
            if (config('app.debug')) {
                // 如果是开发环境，记录详细的异常信息并返回详细的错误给客户端  
                // \Log::error('Exception occurred: ' . $e->getMessage() . PHP_EOL . $e->getTraceAsString());  
                return response()->json([
                    'error' => [
                        'message' => $e->getMessage(), // 具体的错误消息  
                        'file' => $e->getFile(), // 错误发生的文件  
                        'line' => $e->getLine(), // 错误发生的行号  
                        'trace' => explode(PHP_EOL, $e->getTraceAsString()), // 完整的堆栈跟踪（用 PHP_EOL 替换 "\n" 以确保跨平台兼容性）  
                    ],
                ], 500);
            } else {
                // 如果是生产环境，只记录异常信息并返回通用的错误给客户端  
                // \Log::error('Exception occurred: ' . $e->getMessage());  
                return response()->json(['error' => '服务器内部错误，请稍后再试'], 500);
            }
        }
    }


    /**  
     * 获取用户的根目录文件夹名称  
     *  
     * @param int $userId 用户ID  
     * @return string 根目录文件夹名称  
     * @throws \Exception 如果找不到根目录文件夹，则抛出异常  
     */
    private function getRootFolderName($userId)
    {
        // 假设我们有一个字段owner_id来关联文件夹和用户  
        $rootFolder = Folder::where('id', $userId) // 使用owner_id来关联用户  
            ->whereNull('parent_folder_id') // 根目录的parent_folder_id为null  
            ->first();

        if (!$rootFolder) {
            throw new \Exception('找不到用户根文件夹');
        }

        return $rootFolder->folder_name; // 返回根目录文件夹的名称  
    }

    // 定义一个方法获取文件夹路径
    public function getFolderPath($folderId)
    {
        $folder = Folder::find($folderId);
        if ($folder) {
            $path = $folder->getPath(); // 调用模型中的getPath方法获取路径  
            // 现在 $path 包含了文件夹的路径  
        }

        return $path;
    }
}
